package icu.d4peng.cloud.common.core.vo;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.Collection;

/**
 * @author d4peng
 * @version 1.0.0
 * @date 2021-12-24 09:31
 * @description ListVO:列表视图
 */
public class ListVO<T> extends BaseVO {
    /**
     * 数量
     */
    private Long counts;
    /**
     * 数据集合
     */
    private Collection<T> items;

    /**
     * 构造器
     *
     * @param code    状态码
     * @param message 信息
     * @param counts  数量
     * @param items   数据
     */
    public ListVO(Integer code, String message, Long counts, Collection<T> items) {
        super(code, message);
        this.counts = counts;
        this.items = items;
    }

    /**
     * 构造器
     *
     * @param code    状态码
     * @param message 信息
     * @param items   数据
     */
    public ListVO(Integer code, String message, Collection<T> items) {
        this(code, message, (long) items.size(), items);
    }

    /**
     * 构造器
     *
     * @param code    状态码
     * @param message 信息
     */
    public ListVO(Integer code, String message) {
        this(code, message, 0L, new ArrayList<>());
    }

    /**
     * 静态构建方法
     *
     * @param code    状态码
     * @param message 信息
     * @param size    数量
     * @param items   数据集合
     * @param <T>     数据泛型
     * @return 视图对象
     */
    public static <T> ListVO<T> build(Integer code, String message, Long size, Collection<T> items) {
        return new ListVO<>(code, message, size, items);
    }

    /**
     * 静态构建方法(成功)
     *
     * @param items 数据集合
     * @param <T>   数据泛型
     * @return 视图对象
     */
    public static <T> ListVO<T> success(Collection<T> items) {
        return build(200, "OK", ((long) items.size()), items);
    }

    /**
     * 静态构建方法(失败)
     *
     * @return 视图对象
     */
    public static <T> ListVO<T> fail() {
        return build(400, "Bad Request", 0L, new ArrayList<>());
    }

    public Long getCounts() {
        return counts;
    }

    public ListVO<T> setCounts(Long counts) {
        this.counts = counts;
        return this;
    }

    public Collection<T> getItems() {
        return items;
    }

    public ListVO<T> setItems(Collection<T> items) {
        this.items = items;
        return this;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}